package es.uned.modelo;

import es.uned.controlador.PacmanUtils;
import java.awt.Image;
import javax.swing.ImageIcon;

/**
 *
 * @author gabriel
 * Pinky. Buscará colisionar con Pac-Man. Para acercarse a Pac-Man
 * calculará la distancia (por ejemplo medido en filas y columnas) e intentará
 * primero acercarse horizontalmente y luego verticalmente.
 */
public class Pinky extends Fantasma{
    
    private String nombre; //Pink (rosa) 
    private boolean miedo = false, colision=false;
    private int x,y;
    private String ghostPath = PacmanUtils.PINKY_PATH;
    private Image ghostImage;
    private boolean colisionIzquierda=false;
    private boolean colisionDerecha=false;
    private boolean colisionArriba=false;
    private boolean colisionAbajo=false;
    
    
     public Pinky(int x, int y) { 
        ImageIcon gii = new ImageIcon(this.getClass().getResource(ghostPath));
        ghostImage = gii.getImage();       
        this.miedo = false;
        this.nombre = "Speedy (Pinky)";
        this.x = x;
        this.y = y;
    }
     
     
     /**
     * Busca colisionar con pacman, intentará primero acercarse
     * verticalmente y luego horizontalmente.
     */
    public void avanza(Mapa map, int x, int y) {   
         
        //hacia arriba
        if (this.y - y > 0 && !colisionArriba && !this.colision) {
            if (!colision(map, this.x, this.y - 1) ){
                this.y--;  
            } else { 
                colisionArriba=true;
            }
          //Sen caso contrario => hacia abajo
        } else if (y-this.y>0 && !colisionAbajo && !this.colision){
            if (!colision(map, this.x, this.y + 1) ){
                this.y++; 
            } else { 
                colisionAbajo=true;
            }
            //estan en la misma linea
        } else {            
                colisionAbajo=false;
                colisionArriba=false;  
        }
        
        //Si pacman está a la derecha de blinky => avanza hacia la derecha
        if (x - this.x > 0 && !this.colisionDerecha && !this.colision) {
            if (!colision(map, this.x + 1, this.y) ){
                this.x++; 
            } else {
                colisionDerecha = true;     
            }
         //en caso contrario = hacia la derecha
        } else if (this.x-x>0 && !colisionIzquierda && !this.colision){
            if (!colision(map, this.x - 1, this.y) ){
                this.x--; 
            } else { 
                colisionIzquierda=true;
            }
            //estan en la misma linea
        } else {
            colisionIzquierda=false;
            colisionDerecha=false; 
        }  
        
        //si ha colisionado con otro fantasma, entonces ha cambiado 
        //de direccion y ya no está en colision
        if (this.colision){
            this.colision = false;
        } 
    }
    
    /**
     * Recibe las coordenadas de pacman y avanza en dirección contraria.
     * @param map
     * @param x
     * @param y 
     */
   public void huye(Mapa map, int x, int y) { 
//                 
          //Si pacman está a la derecha de blinky => huye hacia la izq
        if (x - this.x > 0 && !this.colisionDerecha && !this.colision) {
            if (!colision(map, this.x-1, this.y) ){
                this.x--; 
            } else {
                colisionDerecha = true;  
            }
         //en caso contrario = hacia la derecha
        } else if (this.x-x>0 && !colisionIzquierda && !this.colision){
            if (!colision(map, this.x +1, this.y) ){
                this.x++; 
            } else { 
                colisionIzquierda=true;
            }
            //estan en la misma linea
        } else {
            colisionIzquierda=false;
            colisionDerecha=false; 
        }  
        
        //hacia abajo
        if (this.y - y > 0 && !colisionArriba && !this.colision) {
            if (!colision(map, this.x, this.y + 1) ){
                this.y++;  
            } else {
//                colision = !colision;
                colisionArriba=true;
            }
          //Sen caso contrario => hacia arriba
        } else if (y-this.y>0 && !colisionAbajo && !this.colision){
            if (!colision(map, this.x, this.y - 1) ){
                this.y--; 
            } else { 
                colisionAbajo=true;
            }
            //estan en la misma linea
        } else {            
                colisionAbajo=false;
                colisionArriba=false;  
        }
        
        //si ha colisionado con otro fantasma, entonces ha cambiado 
        //de direccion y ya no está en colision
        if (this.colision){
            this.colision = false;
        }   
    }

   
    public Image getGhostImage() {
        return ghostImage;
    }

    public void setGhostImage(Image ghostImage) {
        this.ghostImage = ghostImage;
    }  
    
     public String getGhostPath() {
        return ghostPath!=null ? ghostPath:"Ruta imagen "+ this.getClass().getName() +" = null";
    }

    public void setGhostPath(String ghostPath) {
        this.ghostPath = ghostPath;
    }
    
    
    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
    
    @Override
     public void aCasa() {
        this.x = 10;
        this.y = 7;
    }
     
     /**
     *
     * @param map
     * @return
     */
    @Override 
    public boolean colision(Mapa map, int x, int y) {
        boolean ok = false;
        ok = (map.getElement(x, y) == '1') ;
//        if (x>=0 && x<PacmanUtils.COLUMNAS && y>=0 && y<PacmanUtils.FILAS) { 
//            ok = map.getElement(x, y)=='1'; 
//        } 

        return ok;
    }
    
     /**
     * Situa al fantasma en la casilla de salida sin miedo
     */
    @Override
    public void reiniciar() {
        this.miedo = false;
        this.x = 15;
        this.y = 5;
    }
}
